<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en" xml:lang="en" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Concept: Software Architecture</title>
<meta name="uma.type" content="Concept">
<meta name="uma.name" content="software_architecture">
<meta name="uma.presentationName" content="Software Architecture">
<meta name="element_type" content="concept">
<meta name="filetype" content="description">
<meta name="role" content="">
<link rel="StyleSheet" href="./../../../css/default.css" type="text/css">
<script src="./../../../scripts/ContentPageResource.js" type="text/javascript" language="JavaScript"></script><script src="./../../../scripts/ContentPageSection.js" type="text/javascript" language="JavaScript"></script><script src="./../../../scripts/ContentPageSubSection.js" type="text/javascript" language="JavaScript"></script><script src="./../../../scripts/ContentPageToolbar.js" type="text/javascript" language="JavaScript"></script><script src="./../../../scripts/contentPage.js" type="text/javascript" language="JavaScript"></script><script type="text/javascript" language="JavaScript">
					var backPath = './../../../';
					var imgPath = './../../../images/';
					var nodeInfo=null;
					contentPage.preload(imgPath, backPath, nodeInfo,  '', false, false, false);
				</script>
</head>
<body>
<div id="breadcrumbs"></div>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td valign="top"><a name="Top"></a>
<div id="page-guid" value="__O7tAMVvEduLYZUGfgZrkQ"></div>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr>
<td class="pageTitle" nowrap="true">Concept: Software Architecture</td><td width="100%">
<div align="right" id="contentPageToolbar"></div>
</td><td width="100%" class="expandCollapseLink" align="right"><a name="mainIndex" href="./../../../index.htm"></a><script language="JavaScript" type="text/javascript" src="./../../../scripts/treebrowser.js"></script></td>
</tr>
</table>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td class="pageTitleSeparator"><img src="./../../../images/shim.gif" alt="" title="" height="1"></td>
</tr>
</table>
<div class="overview">
<table width="97%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="50"><img src="./../../../images/concept.gif" alt="" title=""></td><td>
<table class="overviewTable" border="0" cellspacing="0" cellpadding="0">
<tr>
<td valign="top">The software architecture represents the structure or structures of the system, which consists of software components, the externally visible properties of those components, and the relationships among them.</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
<div class="sectionHeading">Relationships</div>
<div class="sectionContent">
<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
<tr valign="top">
<th class="sectionTableHeading" scope="row">Related Elements</th><td class="sectionTableCell">
<ul>
<li>
<a href="./../../../practice.tech.evolutionary_arch.base/workproducts/architecture_notebook_9BB92433.html" guid="_0XAf0MlgEdmt3adZL5Dmdw">Architecture Notebook</a>
</li>
<li>
<a href="./../../../practice.tech.evolutionary_design.base/guidances/concepts/design_E36137FA.html" guid="_bFjlAPTYEduDKIuqTXQ8SA">Design</a>
</li>
<li>
<a href="./../../../core.tech.common.extend_supp/guidances/concepts/executable_arch_D4E68CBD.html" guid="_O1kAANvfEduv2KOT-Teh6w">Executable Architecture</a>
</li>
<li>
<a href="./../../../practice.tech.evolutionary_arch.base/guidances/roadmaps/how_to_adopt_evolutionary_arch_practice_FEFA2CCF.html" guid="_Odpz8NciEdy1nJEYZGzN4A">How to adopt the Evolutionary Architecture practice</a>
</li>
</ul>
</td>
</tr>
</table>
</div>
<div class="sectionHeading">Main Description</div>
<div class="sectionContent">
<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
<tr valign="top">
<td class="sectionTableSingleCell"><h3>
    Introduction
</h3>
<p>
    Software architecture is a concept that is easy to understand, and that most engineers intuitively feel, especially
    with a little experience, but it is hard to define precisely. In particular, it is difficult to draw a sharp line
    between design and architecture-architecture is one aspect of design that concentrates on some specific features.
</p>
<p>
    In An Introduction to Software Architecture, David Garlan and Mary Shaw suggest that software architecture is a level
    of design concerned with issues: "Beyond the algorithms and data structures of the computation; designing and
    specifying the overall system structure emerges as a new kind of problem. Structural issues include gross organization
    and global control structure; protocols for communication, synchronization, and data access; assignment of
    functionality to design elements; physical distribution; composition of design elements; scaling and performance; and
    selection among design alternatives." <a class="elementlinkwithusertext" href="./../../../core.default.nav_view.base/guidances/supportingmaterials/references_C6FF2A8D.html" guid="__nHToFndEd2EdJKkAyeBng">[GAR93]</a>
</p>
<p>
    But there is more to architecture than just structure; the IEEE Working Group on Architecture defines it as "the
    highest-level concept of a system in its environment" <a class="elementlinkwithusertext" href="./../../../core.default.nav_view.base/guidances/supportingmaterials/references_C6FF2A8D.html" guid="__nHToFndEd2EdJKkAyeBng">[IEP1471]</a>. It also encompasses the "fit" with system integrity, with economical
    constraints, with aesthetic concerns, and with style. It is not limited to an inward focus, but takes into
    consideration the system as a whole in its user environment and its development environment - an outward focus.
</p>
<p>
    The architecture focuses on specific aspects of the overall system design, concentrating on structure, essential
    elements, key scenarios and those aspects that have a lasting impact on system qualities such as performance,
    reliability, adaptability and cost. It also defines the set of <a class="elementLink" href="./../../../core.tech.common.extend_supp/guidances/concepts/arch_mechanism_2932DFB6.html" guid="_mzxI0A4LEduibvKwrGxWxA">Architectural Mechanism</a>s, <a class="elementLink" href="./../../../core.tech.common.extend_supp/guidances/concepts/pattern_10BE6D96.html" guid="_0YJvUMlgEdmt3adZL5Dmdw">Pattern</a>s and styles that will guide the rest of the design, assuring its integrity.
</p>
<h3>
    Purpose of Architecture
</h3>
<p>
    The architecture can be used for many things:
</p>
<ul>
    <li>
        <strong>To describe the essential structure of the system and the decisions guiding the structure of the
        system</strong> so the integrity and understandability of the system is assured.
    </li>
    <li>
        <a id="Comment71_" name="Comment71_"><strong>To identify and attack risks to the system</strong> (using the
        architecture as an artifact of governance)</a>
    </li>
    <li>
        <strong>To provide context and guidance for developers</strong> to construct the system by describing the
        motivations behind the architectural decisions so those decisions can be robustly implemented. The architecture
        services as the blueprint for development.&nbsp;For example, the architect may place constraints on how data is
        packaged and communicated between different parts of the system. This may appear to be a burden, but the
        justification in the Architecture Notebook can explain that there is a significant performance bottleneck when
        communicating with a legacy system. The rest of the system must adapt to this bottleneck by following a specific
        data packaging scheme.
    </li>
    <li>
        <strong>To provide an overview of the system to whoever must maintain the architecture</strong>, as well as an
        understanding of the motivation behind the important technical decisions.&nbsp; Team members who were not involved
        in those architectural decisions need to understand the reasoning behind the&nbsp;context of the architecture so
        they can best address the needs of the system.
    </li>
    <li>
        <strong>To define the project structure and team organization.</strong> Architectural elements make excellent units
        of implementation, unit testing, integration, configuration management and&nbsp;documentation.&nbsp;&nbsp; They can
        also be used to define&nbsp; so that managers can plan the project.
    </li>
</ul>
<h3>
    Architecture Description
</h3>
<p>
    To speak and reason about software architecture, you must first define an architectural representation, a way of
    describing important aspects of an architecture.
</p>
<p>
    The following is some information that is worth capturing as part of the software architecture:
</p>
<ul>
    <li>
        Architectural goals (see <a class="elementLinkWithType" href="./../../../core.tech.common.extend_supp/guidances/concepts/arch_goals_CB41D8AE.html" guid="_HlRqANpbEdyP58ppo1Ieaw">Concept: Architectural Goals</a>)
    </li>
    <li>
        References to architecturally significant requirements and how the architecture addresses those requirements,
        including&nbsp;key scenarios that describe critical behavior of the system (see <a class="elementLinkWithType" href="./../../../core.tech.common.extend_supp/guidances/concepts/arch_significant_requirements_1EE5D757.html" guid="_HrZGIA4MEduibvKwrGxWxA">Concept: Architecturally Significant Requirements</a>)
    </li>
    <li>
        Constraints on the architecture and how the architecture addresses those constraints (see <a class="elementLinkWithType" href="./../../../core.tech.common.extend_supp/guidances/concepts/arch_constraints_AE56B662.html" guid="_jdKSsNpiEdyP58ppo1Ieaw">Concept: Architectural Constraints</a>)
    </li>
    <li>
        Key abstractions (see <a class="elementLinkWithType" href="./../../../core.tech.common.extend_supp/guidances/concepts/key_abstractions_1474DBF2.html" guid="_pLEGUNqGEdy88NBoQgfGyg">Concept: Key Abstractions</a>)
    </li>
    <li>
        <a class="elementLink" href="./../../../core.tech.common.extend_supp/guidances/concepts/arch_mechanism_2932DFB6.html" guid="_mzxI0A4LEduibvKwrGxWxA">Architectural Mechanism</a> and where they should be applied (see <a class="elementLinkWithType" href="./../../../core.tech.common.extend_supp/guidances/concepts/arch_mechanism_2932DFB6.html" guid="_mzxI0A4LEduibvKwrGxWxA">Concept: Architectural Mechanism</a>).
    </li>
    <li>
        Description of the partitioning approach, as well as a description of the key partitions.&nbsp; For example,
        Layering&nbsp;(see <a class="elementLinkWithType" href="./../../../core.tech.common.extend_supp/guidances/guidelines/layering_F169CF07.html" guid="_0gpkAMlgEdmt3adZL5Dmdw">Guideline: Layering</a>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    </li>
    <li>
        Description of the deployment approach, as well as how key components are allocated to deployment
        nodes.&nbsp;&nbsp;&nbsp;&nbsp;
    </li>
    <li>
        References to architecturally significant design elements (see <a class="elementLinkWithType" href="./../../../core.tech.common.extend_supp/guidances/concepts/component_CB167D48.html" guid="_0YP18MlgEdmt3adZL5Dmdw">Concept: Component</a>)&nbsp;
    </li>
    <li>
        Critical system interfaces (see <a class="elementLinkWithType" href="./../../../core.tech.common.extend_supp/guidances/guidelines/repres_interfaces_to_ext_systems_51A34F6E.html" guid="_0gjdYMlgEdmt3adZL5Dmdw">Guideline: Representing Interfaces to External Systems</a>)
    </li>
    <li>
        Assets that have been reused and/or assets that have been developed to be reused (for more information, see <a class="elementLinkWithType" href="./../../../core.tech.common.extend_supp/guidances/guidelines/software_reuse_B6B04C26.html" guid="_vO2uoO0OEduUpsu85bVhiQ">Guideline: Software Reuse</a>)
    </li>
    <li>
        Guidance, decisions, and constraints the developers must follow in building the system, along with justification
    </li>
</ul>
<p>
    The architecture can contain any information and references that are appropriate in communicating how developers should
    build the system.
</p>
<h4>
    Architectural Representation
</h4>
<p>
    The architecture can be represented in many forms and from many viewpoints, depending on the needs of the project and
    the preferences of the project team. It need not be a formal document. The essence of the architecture can often be
    communicated through a series of simple diagrams on a whiteboard; or as a list of decisions. The illustration just
    needs to show the nature of the proposed solution, convey the governing ideas, and represent the major building blocks
    to make it easier to communicate the architecture to the project team and stakeholders.
</p>
<p>
    If a more complex system is required, then the architecture can be represented as a more comprehensive set
    of&nbsp;views that describe the architecture from a number of viewpoints. For more information, see <a class="elementLinkWithType" href="./../../../core.tech.common.extend_supp/guidances/concepts/arch_views_viewpoints_7A6CD31.html" guid="_kgtcoNc8Edyd7OybSySFxg">Concept: Architectural Views and Viewpoints</a>.
</p>
<p>
    The architecture can be expressed as a simple metaphor or as a comparison to a predefined architectural style or set of
    styles. It may be a precise set of models or documents that describe the various aspects of the system's key elements.
    Expressing it as skeletal implementation is another option - although this may need to be baselined and preserved to
    ensure that the essence of the system can be understood as the system grows. Choose the medium that best meets the
    needs of the project.
</p>
<h3>
    Architectural Patterns
</h3>
<p>
    Architectural <a class="elementLink" href="./../../../core.tech.common.extend_supp/guidances/concepts/pattern_10BE6D96.html" guid="_0YJvUMlgEdmt3adZL5Dmdw">Pattern</a>s are ready-made forms that solve recurring architectural problems. An
    architectural framework or an architectural infrastructure (middleware) is a set of components on which you can build a
    certain kind of architecture. Many of the major architectural difficulties should be resolved in the framework or in
    the infrastructure, usually targeted to a specific domain: command and control, MIS, control system, and so on.
</p>
<p>
    <a class="elementlinkwithusertext" href="./../../../core.default.nav_view.base/guidances/supportingmaterials/references_C6FF2A8D.html" guid="__nHToFndEd2EdJKkAyeBng">[BUS96]</a> groups architectural patterns according to the characteristics of the
    systems in which they are most applicable, with one category dealing with more general structuring issues. The table
    shows the categories presented in <a class="elementlinkwithusertext" href="./../../../core.default.nav_view.base/guidances/supportingmaterials/references_C6FF2A8D.html" guid="__nHToFndEd2EdJKkAyeBng">[BUS96]</a> and the patterns they contain.
</p>
<div align="center">
    <table     style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid"      cellspacing="0" bordercolordark="#808080" cellpadding="4" width="85%" bordercolorlight="#808080" border="1">
        <tbody>
            <tr>
                <th id="col1" width="50%">
                    Category
                </th>
                <th id="col2" width="50%">
                    Pattern
                </th>
            </tr>
            <tr>
                <th id="row2" align="left" headers="col1" width="50%" rowspan="3">
                    Structure
                </th>
                <td headers="row2 col2" width="50%">
                    Layers
                </td>
            </tr>
            <tr>
                <td headers="row2 col2" width="50%">
                    Pipes and Filters
                </td>
            </tr>
            <tr>
                <td headers="row2 col2" width="50%">
                    Blackboard
                </td>
            </tr>
            <tr>
                <th id="row3" align="left" headers="col1" width="50%">
                    Distributed Systems
                </th>
                <td headers="row3 col2" width="50%">
                    Broker
                </td>
            </tr>
            <tr>
                <th id="row4" align="left" headers="col1" width="50%" rowspan="2">
                    Interactive Systems
                </th>
                <td headers="row4 col2" width="50%">
                    Model-View-Controller
                </td>
            </tr>
            <tr>
                <td headers="row4 col2" width="50%">
                    Presentation-Abstraction-Control
                </td>
            </tr>
            <tr>
                <th id="row5" align="left" headers="col1" width="50%" rowspan="2">
                    Adaptable Systems
                </th>
                <td headers="row5 col2" width="50%">
                    Reflection
                </td>
            </tr>
            <tr>
                <td headers="row5 col2" width="50%">
                    Microkernel
                </td>
            </tr>
        </tbody>
    </table><br />
</div>
<p>
    Refer to <a class="elementlinkwithusertext" href="./../../../core.default.nav_view.base/guidances/supportingmaterials/references_C6FF2A8D.html" guid="__nHToFndEd2EdJKkAyeBng">[BUS96]</a> for a complete description of these patterns.
</p>
<h3>
    <a id="Architectural Style" name="Architectural Style">Architectural Style</a>
</h3>
<p>
    A software architecture (or an architectural view) may have an attribute called <b>architectural style</b>, which
    reduces the set of possible forms to choose from, and imposes a certain degree of uniformity to the architecture. The
    style may be defined by a set of patterns, or by the choice of specific components or connectors as the basic building
    blocks.
</p>
<h3>
    Architectural Timing
</h3>
<p>
    Teams should expect to spend more time on architectural issues early in the project.&nbsp; This allows the team to
    reduce risk associated to technology early in the project, hence allowing the team to more rapidly reduce the variance
    in their estimate on what they can deliver at what time. Examples of architectural issues that needs to be resolved
    early on include
</p>
<ul>
    <li>
        Component and their major interfaces
    </li>
    <li>
        Major technology choices (platform, languages, architecture frameworks / reference architectures, etc.)
    </li>
    <li>
        Interfaces to external systems
    </li>
    <li>
        Common services (persistence mechanisms, logging mechanisms, garbage collection, etc.)
    </li>
    <li>
        Key patterns
    </li>
</ul>
<h3>
    Validating the Architecture
</h3>
<p>
    The best way to validate the architecture is to actually implement it.&nbsp; For more information, see <a class="elementLink" href="./../../../core.tech.common.extend_supp/guidances/concepts/executable_arch_D4E68CBD.html" guid="_O1kAANvfEduv2KOT-Teh6w">Executable Architecture</a>.
</p></td>
</tr>
</table>
</div>
<div class="sectionHeading">More Information</div>
<div class="sectionContent">
<table class="sectionTable" border="0" cellspacing="0" cellpadding="0">
<tr valign="top">
<th class="sectionTableHeading" scope="row">Concepts</th><td class="sectionTableCell">
<ul>
<li>
<a href="./../../../core.tech.common.extend_supp/guidances/concepts/arch_constraints_AE56B662.html" guid="_jdKSsNpiEdyP58ppo1Ieaw">Architectural Constraints</a>
</li>
<li>
<a href="./../../../core.tech.common.extend_supp/guidances/concepts/arch_goals_CB41D8AE.html" guid="_HlRqANpbEdyP58ppo1Ieaw">Architectural Goals</a>
</li>
<li>
<a href="./../../../core.tech.common.extend_supp/guidances/concepts/arch_significant_requirements_1EE5D757.html" guid="_HrZGIA4MEduibvKwrGxWxA">Architecturally Significant Requirements</a>
</li>
<li>
<a href="./../../../core.tech.common.extend_supp/guidances/concepts/arch_mechanism_2932DFB6.html" guid="_mzxI0A4LEduibvKwrGxWxA">Architectural Mechanism</a>
</li>
<li>
<a href="./../../../core.tech.common.extend_supp/guidances/concepts/arch_views_viewpoints_7A6CD31.html" guid="_kgtcoNc8Edyd7OybSySFxg">Architectural Views and Viewpoints</a>
</li>
<li>
<a href="./../../../core.tech.common.extend_supp/guidances/concepts/component_CB167D48.html" guid="_0YP18MlgEdmt3adZL5Dmdw">Component</a>
</li>
<li>
<a href="./../../../core.tech.common.extend_supp/guidances/concepts/executable_arch_D4E68CBD.html" guid="_O1kAANvfEduv2KOT-Teh6w">Executable Architecture</a>
</li>
<li>
<a href="./../../../core.tech.common.extend_supp/guidances/concepts/key_abstractions_1474DBF2.html" guid="_pLEGUNqGEdy88NBoQgfGyg">Key Abstractions</a>
</li>
<li>
<a href="./../../../core.tech.common.extend_supp/guidances/concepts/pattern_10BE6D96.html" guid="_0YJvUMlgEdmt3adZL5Dmdw">Pattern</a>
</li>
</ul>
</td>
</tr>
<tr valign="top">
<th class="sectionTableHeading" scope="row">Guidelines</th><td class="sectionTableCell">
<ul>
<li>
<a href="./../../../core.tech.common.extend_supp/guidances/guidelines/layering_F169CF07.html" guid="_0gpkAMlgEdmt3adZL5Dmdw">Layering</a>
</li>
<li>
<a href="./../../../core.tech.common.extend_supp/guidances/guidelines/repres_interfaces_to_ext_systems_51A34F6E.html" guid="_0gjdYMlgEdmt3adZL5Dmdw">Representing Interfaces to External Systems</a>
</li>
<li>
<a href="./../../../core.tech.common.extend_supp/guidances/guidelines/software_reuse_B6B04C26.html" guid="_vO2uoO0OEduUpsu85bVhiQ">Software Reuse</a>
</li>
</ul>
</td>
</tr>
</table>
</div>
<table class="copyright" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="copyright"><p> This program and the accompanying materials are made available under the<br />
  <a href="http://www.eclipse.org/org/documents/epl-v10.php" target="_blank">Eclipse 
  Public License V1.0</a>, which accompanies this distribution. </p><p/><p> <a class="elementLink" href="./../../../core.default.release_copyright.base/guidances/supportingmaterials/openup_copyright_C3031062.html" guid="_UaGfECcTEduSX6N2jUafGA">OpenUP Copyright</a></p></td>
</tr>
</table>
</td>
</tr>
</table>
</body>
<script type="text/javascript" language="JavaScript">
				contentPage.onload();
			</script>
</html>
